home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Ultra Defrag 2 / ultradefrag-2.0.0.bin.i386.exe / scripts / udreportcnv.lua < prev    next >
Text File  |  2008-11-04  |  7KB  |  261 lines

  1. #!/usr/local/bin/lua
  2. --[[
  3.   udreportcnv.lua - UltraDefrag report converter.
  4.   Converts lua reports to HTML and other formats.
  5.   Copyright (c) 2008 by Dmitri Arkhangelski (dmitriar@gmail.com).
  6.  
  7.   This program is free software; you can redistribute it and/or modify
  8.   it under the terms of the GNU General Public License as published by
  9.   the Free Software Foundation; either version 2 of the License, or
  10.   (at your option) any later version.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License
  18.   along with this program; if not, write to the Free Software
  19.   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. --]]
  21.  
  22. -- USAGE: lua udreportcnv.lua <luar file with full path> <path to Windows directory> [-v]
  23.  
  24. -- parse command line
  25. assert(arg[1],"Lua Report file name must be specified!")
  26. assert(arg[2],"Path to the Windows directory\nmust be specified as second parameter!")
  27.  
  28. -- read options
  29. dofile(arg[2] .. "\\UltraDefrag\\options\\udreportopts.lua")
  30.  
  31. -- source file reading
  32. dofile(arg[1])
  33.  
  34.  
  35. -- common functions
  36.  
  37. function write_ansi(f, ...)
  38.     for i, v in ipairs(arg) do f:write(v) end
  39. end
  40.  
  41. function write_unicode(f, ...)
  42.     local b, j
  43.     for i, v in ipairs(arg) do
  44.         j = 1
  45.         while true do
  46.             b = string.byte(v, j)
  47.             if b == nil then break end
  48.             f:write(string.char(b), "\0")
  49.             j = j + 1
  50.         end
  51.     end
  52. end
  53.  
  54. -- write filename to html table; maximum 50 characters per line
  55. function write_ansi_name(f, name)
  56.     local i, j, k, n, len
  57.     local N = max_chars_per_line
  58.     len = string.len(name)
  59.     i = 1
  60.     while len > 0 do
  61.         if len <= N then f:write(string.sub(name,i,i + len - 1)) ; break end 
  62.         j = string.find(name,"\\",i,true)
  63.         if j == nil or j > (i + N) then
  64.             n = N
  65.         else
  66.             k = j
  67.             while true do
  68.                 k = string.find(name,"\\",k + 1,true)
  69.                 if k == nil then break end
  70.                 if k <= (i + N) then j = k else break end
  71.             end
  72.             n = j - i + 1
  73.         end
  74.         f:write(string.sub(name,i,i + n - 1), "<br />")
  75.         if n == 0 then break end -- erroneous situation
  76.         i = i + n
  77.         len = len - n
  78.     end
  79. end
  80.  
  81. function write_chars(f, chars, i, j)
  82.     local k
  83.     for k=i,j do f:write(chars[k]) end
  84. end
  85.  
  86. function find_char(chars, ch, i)
  87.     local k = i
  88.     local result = nil
  89.     while chars[k] ~= nil do
  90.         if chars[k] == ch and chars[k + 1] == '\0' then
  91.             result = k ; break
  92.         end
  93.         k = k + 1
  94.     end
  95.     return result
  96. end
  97.  
  98. function write_unicode_name(f, chars, len)
  99.     local i, j, k, n
  100.     local N = max_chars_per_line * 2
  101.     i = 1
  102.     while len > 0 do
  103.         if len <= N then write_chars(f,chars,i,i + len - 1) ; break end 
  104.         j = find_char(chars,'\\',i)
  105.         if j == nil or j > (i + N) then
  106.             n = N
  107.         else
  108.             k = j
  109.             while true do
  110.                 k = find_char(chars,'\\',k + 1)
  111.                 if k == nil then break end
  112.                 if k <= (i + N) then j = k else break end
  113.             end
  114.             n = j - i + 1 + 1 -- because unicode backslash is '\\\0'
  115.         end
  116.         write_chars(f,chars,i,i + n - 1)
  117.         write_unicode(f,"<br />")
  118.         if n == 0 then break end -- erroneous situation
  119.         i = i + n
  120.         len = len - n
  121.     end
  122. end
  123.  
  124. -- converters
  125.  
  126. table_head = [[
  127. <tr>
  128. <td class="c"><a href="javascript:sort_items('fragments')" style="color: #0000FF"># fragments</a></td>
  129. <td class="c"><a href="javascript:sort_items('name')" style="color: #0000FF">filename</a></td>
  130. <td class="c"><a href="javascript:sort_items('comment')" style="color: #0000FF">comment</a></td>
  131. </tr>
  132. ]]
  133.  
  134. end_of_page = [[
  135. </center>
  136. <script type="text/javascript">
  137. init_sorting_engine();
  138. </script>
  139. </body></html>
  140. ]]
  141.  
  142. links_x1 = [[
  143. <table width="100%"><tbody>
  144. <tr>
  145. <td style="text-align: left"><a href="http://ultradefrag.sourceforge.net" style="color: #0000FF">Visit our Homepage</a></td>
  146. <td style="text-align: center"><a 
  147. ]]
  148.  
  149. links_x2 = [[
  150. style="color: #0000FF">View report options</a></td>
  151. <td style="text-align: right">
  152. <a href="http://www.lua.org/" style="color: #0000FF">Powered by Lua</a>
  153. </td>
  154. </tr>
  155. </tbody></table>
  156. ]]
  157.  
  158. function produce_html_output()
  159.     local filename
  160.     local pos = 0
  161.     local js
  162.     local links = links_x1 .. "href=\"file:///" .. arg[2]
  163.     links = links .. "\\UltraDefrag\\options\\udreportopts.lua\" " .. links_x2
  164.  
  165.     repeat
  166.         pos = string.find(arg[1],"\\",pos + 1,true)
  167.         if pos == nil then filename = "fraglist.htm" ; break end
  168.     until string.find(arg[1],"\\",pos + 1,true) == nil
  169.     filename = string.sub(arg[1],1,pos) .. "fraglist.htm"
  170.  
  171.     -- note that 'b' flag is needed for utf-16 files
  172.     local f = assert(io.open(filename,"wb"))
  173.  
  174.     local write_data
  175.     if use_utf16 == 0 then
  176.         write_data = write_ansi
  177.     else
  178.         write_data = write_unicode
  179.     end
  180.  
  181.     if(enable_sorting == 1) then
  182.         -- read udsorting.js file contents
  183.         local f2 = assert(io.open(arg[2] .. "\\UltraDefrag\\scripts\\udsorting.js", "r"))
  184.         js = f2:read("*all")
  185.         f2:close()
  186.     else
  187.         js = "function init_sorting_engine(){}\nfunction sort_items(criteria){}\n"
  188.     end
  189.     write_data(f,
  190.         "<html><head><title>Fragmented files on ", volume_letter,
  191.         ":</title>\n", style,
  192.         "<script language=\"javascript\">\n", js,
  193.         "</script>\n</head>\n",
  194.         "<body>\n<center>\n", title_tags.open,
  195.         "Fragmented files on ", volume_letter,
  196.         ":", title_tags.close,
  197.         "\n", links, "\n",
  198.         "<div id=\"for_msie\">\n",
  199.         "<table id=\"main_table\" ", table_style, ">\n",
  200.         table_head
  201.         )
  202.     for i, v in ipairs(files) do
  203.         local class
  204.         if v.filtered == 1 then class = "f" else class = "u" end
  205.         write_data(f,
  206.             "<tr class=\"", class, "\"><td class=\"c\">", v.fragments,
  207.             "</td><td>"
  208.             )
  209.         if use_utf16 == 0 then
  210.             -- each <> brackets must be replaced with square brackets
  211.             local tmp = string.gsub(v.name,"<","[")
  212.             tmp = string.gsub(tmp,">","]")
  213.             if split_long_names == 1 then
  214.                 write_ansi_name(f,tmp)
  215.             else
  216.                 f:write(tmp)
  217.             end
  218.         else
  219.             if split_long_names == 1 then
  220.                 local chars = {}
  221.                 local i = 1
  222.                 for j, b in ipairs(v.uname) do
  223.                     chars[i] = string.char(b)
  224.                     i = i + 1
  225.                 end
  226.                 write_unicode_name(f,chars,i - 1)
  227.             else
  228.                 for j, b in ipairs(v.uname) do
  229.                     f:write(string.char(b))
  230.                 end
  231.             end
  232.         end
  233.         write_data(f,
  234.             "</td><td class=\"c\">", v.comment,
  235.             "</td></tr>\n"
  236.             )
  237.     end
  238.     write_data(f,
  239.         --table_head,
  240.         "</table>\n</div>\n", links, "\n"
  241.         )
  242.     write_data(f,end_of_page)
  243.     f:close()
  244.     
  245.     -- if option -v is specified, open report in default web browser
  246.     if arg[3] == "-v" then
  247.         if os.shellexec ~= nil then
  248.             os.shellexec(filename,"open")
  249.         else
  250.             os.execute("cmd.exe /C " .. filename)
  251.         end
  252.     end
  253. end
  254.  
  255.  
  256. -- main source code
  257. -- convertion to other (readable) formats
  258. if produce_html == 1 then
  259.     produce_html_output()
  260. end
  261.